package com.zzz.first;

import java.util.*;

/*
 * @author zzr
 * @date: 2025/07/07  10:03
 * @description:给定两个整数数组分别为nums1,nums2，找到它们的公共元素并按返回， 补充：下面的方法，是将公共元素多次输出了！
 */
public class Demo2_1 {

    public ArrayList<Integer> intersection (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {
        // write code here

        // 存储公共元素
        ArrayList<Integer> result = new ArrayList<>();
        // 使用 HashMap 来统计 nums1 中每个元素出现的次数，
        // HashMap 的键作为数据中的元，值为该元素出现的次数
        HashMap<Integer, Integer> map = new HashMap<>();

        // 遍历 nums1，统计每个元素出现的次数
        for (Integer num : nums1) {
            /**
             * map.getOrDefault(key, defaultValue)
             * 作用：从 map 中获取指定键 key 对应的值
             * 如果 key 存在，返回对应的值
             * key 不存在，返回传入的默认值 defaultValue
             */
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // 遍历 nums2，检查元素是否在 nums1 中出现过
        for (Integer num : nums2) {
            if (map.containsKey(num) && map.get(num) > 0) {
                // 检查 nums2 中的元素在 HashMap 中存在，且计数 大于 0，说明是公共元素
                result.add(num);
                // 添加后，要把元素在 map 中的计数 -1 避免重复添加
                map.put(num, map.get(num) - 1);
            }
        }
        return result;
    }
}